﻿/*
 *      CentroVentasCore32  - CVCore32.dll
 *      
 *      Desarrollado por:
 *                      Francisco Acevedo.
 *                      David Avila.
 *                      José Pérez.
 *                      
 *      Todos los derechos reservados.
 */

/*
 *      CLASE: Precio   
 * Notas de versión:
 * 
 * [13-01-2012]
 *      -   Creacion de la clase.
 *      -   Añadidos funciones importantes.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CVCore32.Class.Funciones.Productos
{
    public enum MetodoDeValoracionDeInventario
    {
        IdentificacionEspecifica, PEPS, UEPS, CostoPromedio
    }

    public class Precio
    {
        private int _idPrecio, _idProducto;

        public int IdPrecio
        {
            get { return _idPrecio; }
            set { _idPrecio = value; }
        }

        public int IdProducto
        {
            get { return _idProducto; }
            set { _idProducto = value; }
        }

        public static Data.Precio GetPrecio(int idProducto, MetodoDeValoracionDeInventario MetodoDeValoracionDeInventario)
        {
            try
            {
                if (MetodoDeValoracionDeInventario == MetodoDeValoracionDeInventario.IdentificacionEspecifica)
                {
                    throw new Exception("No se puede usar este metodo si no se especifica que precio se accedera");
                }
                else
                {
                    if (Class.Funciones.Productos.Producto.ExisteProducto(idProducto))
                    {
                        CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                        Data.electrondbEntities context;
                        if (sesion.ServidorWeb)
                        {
                            context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                        }
                        else
                        {
                            context = new Data.electrondbEntities();
                        }

                        if (ExistePrecio(idProducto))
                        {
                            if (MetodoDeValoracionDeInventario == Productos.MetodoDeValoracionDeInventario.PEPS)
                            {
                                Data.Precio p = (from pre in context.Precio
                                                 where pre.Producto == idProducto
                                                 where pre.Valido == 1
                                                 where pre.CActual != 0
                                                 orderby pre.FechaCreado ascending
                                                 select pre).SingleOrDefault();
                                return p;
                            }
                            else if (MetodoDeValoracionDeInventario == Productos.MetodoDeValoracionDeInventario.UEPS)
                            {
                                Data.Precio p = (from pre in context.Precio
                                                 where pre.Producto == idProducto
                                                 where pre.Valido == 1
                                                 where pre.CActual != 0
                                                 orderby pre.FechaCreado descending
                                                 select pre).SingleOrDefault();
                                return p;
                            }
                            else
                            {
                                // COSTO PROMEDIO
                                return new Data.Precio();
                            }
                        }
                        else
                        {
                            throw new Exception("No existe precio para el producto");
                        }
                    }
                    else
                    {
                        throw new Exception("Producto no existe");
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }


        public static bool ExistePrecio(int idProducto)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            var prod = (from pro in context.Precio
                        where pro.Producto == idProducto
                        select pro.PrecioId).Count();

            if (prod != 0)
                return true;
            else
                return false;
        }

        public static double getPrecioVenta(double costo, double utilidad, double iva)
        {
            return Convert.ToDouble(decimal.Round(Convert.ToDecimal((costo * ((utilidad / 100) + 1)) * ((iva / 100) + 1)), 0, MidpointRounding.AwayFromZero));
        }

        public static double getUtilidad(double costo, double precioSugerido)
        {
            return Math.Round(((precioSugerido - (costo + (precioSugerido - (precioSugerido / 1.19)))) / costo) * 100, 0, MidpointRounding.ToEven);
        }
    }
}
